﻿using System;
using System.Collections.Generic;


namespace MLopez.BizVal.CW.Base
{
    /// <summary>
    /// Representa un conjunto de etiquetas con una granularidad dada.
    /// </summary>
    public class ConjuntoEtiquetas:IComparable<ConjuntoEtiquetas>, IEnumerable<TriEtiqueta>
    {        
        List<TriEtiqueta> m_conjunto;        
        string name = string.Empty;
        int g;

        public decimal G 
        {
            get
            {
                return g;
            }
                  
        }

        /// <summary>
        /// Nombre que representa al conjunto
        /// </summary>
        public string Nombre
        {
            get { return name; }
            set { name = value; }
        }

        
        /// <summary>
        /// Granularidad del conjunto (número de etiquetas).
        /// </summary>
        public  int Granularidad
        {
            get
            {
                return m_conjunto.Count;
            }
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public TriEtiqueta this[int index]
        {
            get
            {
                if ((index < 0) || (index >= Granularidad))
                    throw new CWException(CWExceptionType.IndexOutOfRange);
                return m_conjunto[index];
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="granularidad"></param>
        public ConjuntoEtiquetas(int granularidad)
        {
            if (granularidad < 2)
                throw new CWException(CWExceptionType.HierarchyCardinalityError);
            m_conjunto = new List<TriEtiqueta>(granularidad);
            g = granularidad-1;
            InicializarEtiquetas();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="granularidad"></param>
        /// <param name="nombre"></param>
        public ConjuntoEtiquetas(int granularidad, string nombre):this(granularidad)
        {
            name = nombre;
            
        }

        private void InicializarEtiquetas()
        {
            decimal paso = 1m/g;
            decimal a,m,b;
            int i=0;

            //Ponemos la primera etiqueta 
            a = 0;
            m = 0;
            b = paso;            
            TriEtiqueta primera = new TriEtiqueta(0,0, paso);
            primera.Indice = 0;
            m_conjunto.Add(primera);

            for (i = 1; i < g; i++)
            {
                a = m;
                m = b;
                b = b + paso;
                TriEtiqueta intermedias = new TriEtiqueta(a, m, b);
                intermedias.Indice = i;
                m_conjunto.Add(intermedias);
            }

            TriEtiqueta ultima = new TriEtiqueta(m, 1, 1);
            ultima.Indice = i;
            m_conjunto.Add(ultima);            
        }


        public bool Contains(TriEtiqueta etiqueta)
        {
            return m_conjunto.Contains(etiqueta);
        }

        public int IndexOf(TriEtiqueta etiqueta)
        {
            return m_conjunto.IndexOf(etiqueta);
        }
        
        #region IComparable<ConjuntoEtiquetas> Members
        /// <summary>
        /// 
        /// </summary>
        /// <param name="other"></param>
        /// <returns></returns>
        public int CompareTo(ConjuntoEtiquetas other)
        {
            return (this.Granularidad - other.Granularidad);
        }

        #endregion



        public IEnumerator<TriEtiqueta> GetEnumerator()
        {
            return m_conjunto.GetEnumerator();
        }

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return m_conjunto.GetEnumerator();
        }
    }
}
